#ifndef CONEXION_H_INCLUDED
#define CONEXION_H_INCLUDED

#include "cola_posix.h"
#include "mensaje.h"
#include "callback_conexion.h"
#include "threads.h"
#include "logger.h"

class Conexion{
private:
    Cola colaEmisora, colaReceptora;
    Cola colaEscucha;
    bool conectado;
    CallbackConexion *callback;

    class ThreadConexion:public Thread{
	Conexion *conexion;
	public:
	ThreadConexion(Conexion *c){ conexion=c;}
	void run(){
	    Logger::log("Comienza el thread receptor de la conexion\n");
	    while(isRunning()){
		Logger::log("Espero mensajes:\n");
		Mensaje m=conexion->recibir();

		if(isRunning()){
		    conexion->callback->setMensaje(m);
		    Logger::log("Llamo al callback\n");
		    conexion->callback->run();
		}
	    }
	    Logger::log("Salgo del loop del thread\n");
	}
    };

    ThreadConexion *thread;

public:
    Conexion();
    void conectar(std::string direccion) throw();
    bool estaConectado();
    void registrarCallbackRecepcion(CallbackConexion *cc) throw();
    void cerrar();
    void enviar(Mensaje &m) throw();
    Mensaje recibir() throw();
    void escuchar(std::string nombre);
    Conexion* aceptar() throw();
    ~Conexion(){ cerrar();}
};

#endif //CONEXION_H_INCLUDED
